﻿using System;
using System.Collections.Generic;
using System.Linq;
using System.Text;
using System.Data;

namespace Ruandao.MiniAccess
{
    /// <summary>
    /// 用于标记实体属性的自定义列映射，系统自动根据数据库中的架构信息生成默认的列映射信息，然后使用该标记的映射信息覆盖自动获取的映射信息。
    /// </summary>
    [AttributeUsage(AttributeTargets.Property)]
    public class ColumnMapAttribute : Attribute
    {
        /// <summary>
        /// 默认构造。
        /// </summary>
        public ColumnMapAttribute()
        { }

        /// <summary>
        /// 该构造指定实体属性所对应的列名称。
        /// </summary>
        /// <param name="columnName"></param>
        public ColumnMapAttribute(string columnName)
        {
            this.columnName = columnName;
        }

        private string columnName;
        /// <summary>
        /// 列名称，不包括可能需要的中括号。 
        /// </summary>
        public string ColumnName 
        {
            get { return this.columnName; }
        }

        /// <summary>
        /// 列在数据库中的原生数据类型名称。
        /// </summary>
        public string TypeName { get; set; }

        /// <summary>
        /// 在数据库脚本中声明该列对应数据时的声明类型。
        /// </summary>
        public string DeclareType { get; set; }

        /// <summary>
        /// 列对应的Ado.Net中的DbType类型。
        /// </summary>
        public DbType DbType { get; set; }

        /// <summary>
        /// 列对应的.Net Framework中的System.Type类型。
        /// </summary>
        public System.Type SystemType { get; set; }

        /// <summary>
        /// 指出是否计算了在列中的值：（是或否）。数据库架构表中的列名是computed，类型是int。
        /// </summary>
        public string Computed {get; set; }

        /// <summary>
        /// 以字节为单位的列长度。数据库架构表中的列名是prec，类型是char(5)。
        /// </summary>
        public int Length {get; set; }

        /// <summary>
        /// 列精度。数据库架构表中的列名是prec，类型是nvarchar(128)。
        /// </summary>
        public string Prec {get; set; }

        /// <summary>
        /// 列数值范围。数据库架构表中的列名是scale，类型是char(5)。
        /// </summary>
        public string Scale {get; set; }

        /// <summary>
        /// 指明是否允许 NULL 值：是或否。数据库架构表中的列名是nullable，类型是varchar(35)。
        /// </summary>
        public string Nullable {get; set; }

        /// <summary>
        /// 映射类型。
        /// </summary>
        public ColumnMapType ColumnMapType {get; set; }

        /// <summary>
        /// 插入数据时，是否包括该字段。通常，表的自动增量的标识列，不需要包括在INSERT语句中。
        /// </summary>
        public bool IsInsert {get; set; }

        /// <summary>
        /// 更新数据时，是否包括该字段。通常，主键不需要更新。
        /// </summary>
        public bool IsUpdate {get; set; }

    }
}
